﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ATEC.GeometryNET;
using ATEC.GeometryNET.Common;
using ATEC.ATCoreNET;
using ATEC.ATDataCoreNET;
using ATEC.ATDataCoreNET.ATCCL;
using ATEC.CCLObj;
using SSDPNET.DataCore;
using ATEC.CCLObj.Entity;
using SSDPObject;

/// <summary>
/// 文件名：EasyCCFTestStruct.cs
/// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/EasyCCF机制
/// 
/// 功能概述：
/// 定义了一套基于EasyCCF机制的属性结构体系，用于简化CCF属性的操作和管理。
/// 
/// EasyCCF机制特点：
/// 1. 声明式定义：
///    - 使用[CCF]和[CCLanProperty]特性直接定义CCF结构
///    - 无需手动编写属性映射代码
///    - 自动处理属性的序列化和反序列化
/// 
/// 2. 继承支持：
///    - 支持通过类继承扩展CCF属性（如EasyCCFTestStruct继承Example）
///    - 保持属性的层次结构清晰
/// 
/// 3. 复杂类型支持：
///    - 支持基本类型、几何类型(XPoint3d, CurveSet)
///    - 支持嵌套结构体(EasyCCFTestNest1, EasyCCFTestNest2)
///    - 支持集合类型(List<XPoint3d>, List<EasyCCFTestNest1>)
/// 
/// 与CCFWorkTestStruct对比：
/// 1. 代码量：
///    - EasyCCF：仅需定义属性和特性标记
///    - 传统方式：需要手动编写SaveToInstance和LoadEntity方法
/// 
/// 2. 使用方式：
///    - EasyCCF：
///      * 使用 SSDPObject.EasyCCF.ToCCF(instance, obj) 保存
///      * 使用 SSDPObject.EasyCCF.FromCCF(instance, obj) 读取
///    - 传统方式：
///      * 需要手动调用SaveToInstance方法保存
///      * 需要手动调用LoadEntity方法读取
///      * 需要手动处理每个属性的类型转换
/// 
/// 3. 维护成本：
///    - EasyCCF：添加新属性只需添加属性定义和特性标记
///    - 传统方式：添加新属性需要同时修改SaveToInstance和LoadEntity方法
/// 
/// 4. 错误处理：
///    - EasyCCF：框架自动处理类型转换和空值检查
///    - 传统方式：需要手动编写错误检查代码
/// 
/// 使用场景：
/// 1. 推荐使用EasyCCF：
///    - 标准的属性结构定义
///    - 需要快速开发和维护
///    - 属性结构相对稳定
/// 
/// 2. 考虑使用传统方式：
///    - 需要特殊的序列化逻辑
///    - 需要精细的性能控制
///    - 有复杂的数据转换需求
/// 
/// 注意事项：
/// 1. CCF特性配置必须与数据库中的CCF定义匹配
/// 2. 嵌套属性的层次不宜过深，建议不超过两层
/// 3. 集合类型属性初始化时建议使用默认构造
/// </summary>
namespace CCFWorkExample
{
    /// <summary>
    /// 类名：Example
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/基础属性
    /// 功能：定义基础CCF属性结构
    /// 关键属性：
    ///     - Length：长度属性
    ///     - Color：颜色属性
    /// CCF配置：
    ///     - ccfName: SSDPNETExample
    ///     - cclanName: Example
    /// </summary>
    [CCF(ccfName = "SSDPNETExample", cclanName = "Example")]  // CCF属性定义标记
    public class Example
    {
        [CCLanProperty(cclanPropName = "Length")]  // CCF属性名称定义
        public double Length { get; set; } = new double();  // 长度属性，默认值为0

        [CCLanProperty(cclanPropName = "Color")]  // CCF属性名称定义
        public string Color { get; set; }  // 颜色属性
    };

    /// <summary>
    /// 类名：EasyCCFTestStruct
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/复合属性
    /// 功能：定义复合CCF属性结构，继承自Example基础属性
    /// 关键属性：
    ///     - ElemId：对象ID
    ///     - PtStart：起始点坐标
    ///     - SubCrv：子曲线集合
    ///     - AllPts：点集合
    ///     - ListNest1：嵌套属性列表
    /// CCF配置：
    ///     - ccfName: SSDPNETExample
    ///     - cclanName: EasyCCFTestStruct
    /// </summary>
    [CCF(ccfName = "SSDPNETExample", cclanName = "EasyCCFTestStruct")]  // CCF属性定义标记
    public class EasyCCFTestStruct : Example  // 继承基础属性类
    {
        [CCLanProperty(cclanPropName = "ElemId")]  // CCF属性名称定义
        public long ElemId { get; set; }  // 对象ID属性

        [CCLanProperty(cclanPropName = "PtStart")]  // CCF属性名称定义
        public XPoint3d PtStart { get; set; }  // 起始点坐标属性

        [CCLanProperty(cclanPropName = "Nest1")]  // CCF属性名称定义
        public EasyCCFTestNest1 Nest1 { get; set; } = new EasyCCFTestNest1();  // 嵌套属性对象，默认初始化

        [CCLanProperty(cclanPropName = "SubCrv")]  // CCF属性名称定义
        public CurveSet SubCrv { get; set; }  // 子曲线集合属性

        [CCLanProperty(cclanPropName = "AllPts")]  // CCF属性名称定义
        public List<XPoint3d> AllPts { get; set; } = new List<XPoint3d>();  // 点集合属性，默认初始化

        [CCLanProperty(cclanPropName = "ListNest1")]  // CCF属性名称定义
        public List<EasyCCFTestNest1> ListNest1 { get; set; } = new List<EasyCCFTestNest1>();  // 嵌套属性列表，默认初始化
    };

    /// <summary>
    /// 类名：EasyCCFTestNest1
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/嵌套属性
    /// 功能：定义第一层嵌套CCF属性结构
    /// 关键属性：
    ///     - Nest1_Index：序号属性
    ///     - Nest1_Fraction：比率属性
    ///     - Nest2：二层嵌套属性
    /// CCF配置：
    ///     - ccfName: SSDPNETExample
    ///     - cclanName: EasyCCFTestNest1
    /// </summary>
    [CCF(ccfName = "SSDPNETExample", cclanName = "EasyCCFTestNest1")]  // CCF属性定义标记
    public class EasyCCFTestNest1
    {
        [CCLanProperty(cclanPropName = "Nest1_Index")]  // CCF属性名称定义
        public int Nest1_Index { get; set; }  // 序号属性

        [CCLanProperty(cclanPropName = "Nest1_Fraction")]  // CCF属性名称定义
        public double Nest1_Fraction { get; set; }  // 比率属性

        [CCLanProperty(cclanPropName = "Nest2")]  // CCF属性名称定义
        public EasyCCFTestNest2 Nest2 { get; set; } = new EasyCCFTestNest2();  // 二层嵌套属性对象，默认初始化
    };

    /// <summary>
    /// 类名：EasyCCFTestNest2
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/嵌套属性
    /// 功能：定义第二层嵌套CCF属性结构
    /// 关键属性：
    ///     - Nest2_Index：序号属性
    ///     - Nest2_Fraction：比率属性
    /// CCF配置：
    ///     - ccfName: SSDPNETExample
    ///     - cclanName: EasyCCFTestNest2
    /// 说明：作为最深层的嵌套属性，不再包含其他嵌套结构
    /// </summary>
    [CCF(ccfName = "SSDPNETExample", cclanName = "EasyCCFTestNest2")]  // CCF属性定义标记
    public class EasyCCFTestNest2
    {
        [CCLanProperty(cclanPropName = "Nest2_Index")]  // CCF属性名称定义
        public int Nest2_Index { get; set; }  // 序号属性

        [CCLanProperty(cclanPropName = "Nest2_Fraction")]  // CCF属性名称定义
        public double Nest2_Fraction { get; set; }  // 比率属性
    };
}
